<?php
class Outpays {
  function __construct() {
  }

  public function select() {
  
    $data = new jqGridData();
    try
    {
// Только зарегистрированные пользователи могут видеть данные
		if( !isset($_SESSION['user_id']) || $_SESSION['user_id'] == 0 )
			throw new Exception(ERR_M::TIMEOUT_ERROR, 999);

// Есть ли права на просмотр чьих либо записей
		$rwd = $_SESSION['priv']->outpays->rwd;
		if( ($rwd & PERM_BITS::READ_ANY) == 0 ) throw new Exception(ERR_M::DATA_ACC_DISABLED, 99);

// Проверяем данные
        $page    = ( isset($_REQUEST["page"]) && $_REQUEST["page"] > 0 ) ? $_REQUEST["page"] : 1;
        $limit    = ( isset($_REQUEST["rows"]) && $_REQUEST["rows"] > 0 ) ? $_REQUEST["rows"] : 1;
        $sidx    = ( isset($_REQUEST["sidx"]) && $_REQUEST["sidx"] != '' ) ? $_REQUEST["sidx"] : 'outp_bank_date';
        $sord    = ( isset($_REQUEST["sord"]) && strtolower($_REQUEST["sord"]) == 'desc' ) ? 'DESC' : 'ASC';
        $search    = ( isset($_REQUEST["_search"]) && strtolower($_REQUEST["_search"]) == 'true') ? true : false;
 
// Открываем базу данных
		$db = App::me()->dbOpen();	

// Фильтр от пользователя
        $whc = array();
        if( $search )
        {
            if(isset($_REQUEST["outp_id"]) && is_numeric($_REQUEST["outp_id"]) ) {
				$whc[] = "outp_id=" . $db->quote($_REQUEST["outp_id"]);
		    }
            
            if(isset($_REQUEST["outp_job_id"]) && ctype_digit($_REQUEST["outp_job_id"]) ) {
				$whc[] = "outp_job_id=" . $db->quote($_REQUEST["outp_job_id"]);
		    }
            
            if(isset($_REQUEST["outp_cont_id"]) && $_REQUEST["outp_cont_id"] != "") {
		    	$whc[] = "outp_cont_id=" . $db->quote($_REQUEST["outp_cont_id"]);
            }

            if(isset($_REQUEST["cont_name"]) && $_REQUEST["cont_name"] != "") {
		    	$whc[] = "cont_name LIKE " . $db->quote("%".$_REQUEST["cont_name"]."%");
            }

            if(isset($_REQUEST["outp_build_id"]) && $_REQUEST["outp_build_id"] != "") {
		    	$whc[] = "outp_build_id=" . $db->quote($_REQUEST["outp_build_id"]);
            }

            if(isset($_REQUEST["build_name"]) && $_REQUEST["build_name"] != "") {
		    	$whc[] = "build_name LIKE " . $db->quote("%".$_REQUEST["build_name"]."%");
            }
			
            if(isset($_REQUEST["outp_bank_date"]) && $_REQUEST["outp_bank_date"] != "") {
				$dt = '';
				if( preg_match( '/^(\d\d)\.(\d\d)\.(\d\d\d\d)$/', $_REQUEST["outp_bank_date"], $dmy ) )
					$dt = $dmy[3].'-'.$dmy[2].'-'.$dmy[1];
				elseif( preg_match( '/^(\d\d)\.(\d\d\d\d)$/', $_REQUEST["outp_bank_date"], $dmy ) )
					$dt = $dmy[2].'-'.$dmy[1];
				elseif( preg_match( '/^(\d\d\d\d)$/', $_REQUEST["outp_bank_date"], $dmy ) )
					$dt = $dmy[1];
				
				if( $dt )
					$whc[] = "outp_bank_date LIKE " . $db->quote("%".$dt."%");
            }
			
            if(isset($_REQUEST["outp_amount"]) && $_REQUEST["outp_amount"] != "") {
		    	$whc[] = "outp_amount LIKE " . $db->quote("%".$_REQUEST["outp_amount"]."%");
            }
			
            if(isset($_REQUEST["outp_content"]) && $_REQUEST["outp_content"] != "") {
		    	$whc[] = "outp_content LIKE " . $db->quote("%".$_REQUEST["outp_content"]."%");
            }
			
            if(isset($_REQUEST["outp_account"]) && $_REQUEST["outp_account"] != "") {
		    	$whc[] = "outp_account LIKE " . $db->quote("%".$_REQUEST["outp_account"]."%");
            }
			
            if(isset($_REQUEST["outp_person"]) && $_REQUEST["outp_person"] != "") {
		    	$whc[] = "outp_person LIKE " . $db->quote("%".$_REQUEST["outp_person"]."%");
            }
			
            if(isset($_REQUEST["outp_invoice_act"]) && $_REQUEST["outp_invoice_act"] != "") {
		    	$whc[] = "outp_invoice_act LIKE " . $db->quote("%".$_REQUEST["outp_invoice_act"]."%");
            }
			
            if(isset($_REQUEST["outp_invoice_tax"]) && $_REQUEST["outp_invoice_tax"] != "") {
		    	$whc[] = "outp_invoice_tax LIKE " . $db->quote("%".$_REQUEST["outp_invoice_tax"]."%");
            }
			
            if(isset($_REQUEST["outp_comment"]) && $_REQUEST["outp_comment"] != "") {
		    	$whc[] = "outp_comment LIKE " . $db->quote("%".$_REQUEST["outp_comment"]."%");
            }
			
		}
		
// Фильтр привилегий
		if( $rwd & PERM_BITS::READ_OTH ) $whc[] = '1 = 1';
		elseif( $rwd & PERM_BITS::READ_GRP ) 
			$whc[] = 'outp_user_id IN (SELECT user_id FROM users WHERE cat_id = '.$_SESSION['cat_id'].')';
		elseif( $rwd & PERM_BITS::READ_OWN ) $whc[] = 'outp_user_id = '.$_SESSION['user_id'];
		else $whc[] = '1 = 0';
		
        $whereclaus = (count($whc) != 0 ) ? " WHERE " . implode(" AND ", $whc) : "";
		unset($whc);
            
// Получаем количество записей с учетом фильтра
        $join1 = "INNER JOIN contra ON contra.cont_id = outpays.outp_cont_id ";
        $join2 = "INNER JOIN builds ON builds.build_id = outpays.outp_build_id ";
		$join3 = "LEFT JOIN jobs ON jobs.job_id = outpays.outp_job_id ".
					"LEFT JOIN jobtypes ON jobtypes.jtp_id = jobs.job_jtp_id ".
					"LEFT JOIN outtypes ON outtypes.otp_jtp_id = jobtypes.jtp_id AND ".
							  "outtypes.otp_id = outpays.outp_otp_id ";
            
        $sqlreq = "SELECT COUNT(*) AS count FROM outpays ".$join1.$join2.$whereclaus;
        $recset = $db->query( $sqlreq );
		$row = $recset->fetch(PDO::FETCH_ASSOC);
		$count = $row['count'];
		$recset->closeCursor();
            
// Пустая таблица
        if ($count == 0)
			throw new Exception(ERR_M::SUCCESS, 0);
            
// Рассчитаем сколько всего страниц займут данные в БД
    	if( $count > 0 && $limit > 0) {
    		$total_pages = ceil($count/$limit);
    	} else {
    		$total_pages = 0;
    	}                  
 
		if ($page > $total_pages) $page=$total_pages;                  
 
		$start = $limit*$page - $limit;                   
		if($start < 0) $start = 0;                  
 
// Формируем запрос
		$sqlreq =   "SELECT outp_id, outp_bank_date, outp_amount, outp_cont_id, cont_name, cont_nds, ".
					"outp_build_id, build_name, outp_job_id, outp_otp_id, otp_code, outp_content, ".
					"outp_account, outp_person, outp_invoice_act, outp_invoice_tax, outp_comment ".
					"FROM outpays ".$join1.$join2.$join3.$whereclaus." ORDER BY ".$sidx." ".$sord.
		            " LIMIT ".$start.", ".$limit;

		$recset = $db->query($sqlreq);                  
 
// Формирование объекта для возврата
        
    	$data->page      = $page;
    	$data->total     = $total_pages;
    	$data->records   = $count;
    		
    // Строки данных для таблицы
		$i = 0;
		while($row = $recset->fetch(PDO::FETCH_ASSOC)) {
		
			$status = 0;
			if( $row['cont_nds'] ) $status |= 1;
			if( ( $row['outp_invoice_act'] == '' || $row['outp_invoice_tax'] == '' ) &&
				( strtotime( '-30 days' ) > strtotime( $row['outp_bank_date'] ) ) ) 
				$status |= 2;
				
			preg_match( '/(\d\d\d\d)-(\d\d)-(\d\d)/', $row['outp_bank_date'], $dmy );
			$data->rows[$i]['id'] = $row['outp_id'];
			$data->rows[$i]['cell'] = array(
					$row['outp_id'],
					$status,
					$dmy[3].'.'.$dmy[2].'.'.$dmy[1],
					$row['outp_amount'],
					$row['outp_cont_id'],
				    $row['cont_name'],
					$row['outp_build_id'],
				    $row['build_name'],
					$row['outp_job_id'],
					$row['outp_content'],
					$row['outp_otp_id'],
					$row['otp_code'],
					$row['outp_account'],
					$row['outp_person'],
					$row['outp_invoice_act'],
					$row['outp_invoice_tax'],
					$row['outp_comment']
		    );
		    $i++;
		}
    }
	catch (PDOException $e) {
		$data->userdata->errcode = 1;
		$data->userdata->errmess = ERR_M::DATABASE_ERROR;
	}
    catch ( Exception $e ) {
		$data->userdata->errcode = $e->getCode();
		$data->userdata->errmess = $e->getMessage();
	}
 
	return $data;
  }
  
  
  public function insert() {

    $outp_bank_date	= isset($_POST['outp_bank_date']) ? trim(strip_tags($_POST['outp_bank_date'])) : '';
    $outp_amount		= isset($_POST['outp_amount']) ? trim(strip_tags($_POST['outp_amount'])) : '';
    $outp_cont_id	= isset($_POST['outp_cont_id']) ? trim(strip_tags($_POST['outp_cont_id'])) : '';
    $cont_name 		= isset($_POST['cont_name']) ? trim(strip_tags($_POST['cont_name'])) : '';
    $outp_build_id	= isset($_POST['outp_build_id']) ? trim(strip_tags($_POST['outp_build_id'])) : '';
    $build_name		= isset($_POST['build_name']) ? trim(strip_tags($_POST['build_name'])) : '';
    $outp_content 	= isset($_POST['outp_content']) ? trim(strip_tags($_POST['outp_content'])) : '';
    $outp_job_id 	= isset($_POST['outp_job_id']) ? trim(strip_tags($_POST['outp_job_id'])) : '';
    $outp_otp_id 	= isset($_POST['outp_otp_id']) ? trim(strip_tags($_POST['outp_otp_id'])) : '';
    $outp_account 	= isset($_POST['outp_account']) ? trim(strip_tags($_POST['outp_account'])) : '';
    $outp_person		= isset($_POST['outp_person']) ? trim(strip_tags($_POST['outp_person'])) : '';
    $outp_invoice_act = isset($_POST['outp_invoice_act']) ? trim(strip_tags($_POST['outp_invoice_act'])) : '';
    $outp_invoice_tax = isset($_POST['outp_invoice_tax']) ? trim(strip_tags($_POST['outp_invoice_tax'])) : '';
    $outp_comment	= isset($_POST['outp_comment']) ? trim(strip_tags($_POST['outp_comment'])) : '';
	
	$cont_person = '';
	$cont_nds = 1;

	$errcode = 0;
	$errmess = '';
    try
    {
// Открываем базу данных
		$db = App::me()->dbOpen();	

// Только зарегистрированные пользователи могут вносить данные
		if( !isset($_SESSION['user_id']) || $_SESSION['user_id'] == 0 )
			throw new Exception(ERR_M::TIMEOUT_ERROR, 999);
		$outp_user_id = $_SESSION['user_id'];
		
//Есть ли разрешение на вставку записей
		$rwd = $_SESSION['priv']->outpays->rwd;
		if( ($rwd & PERM_BITS::WRITE_OWN) == 0 ) throw new Exception(ERR_M::DATA_OPER_DISABLED, 99);

// Все ли данные переданы
		$errdata = "";
		
// outp_bank_date
		if( $outp_bank_date == '' ) $errdata .= ($errdata?'<br>':'')."- Не указана дата оплаты.";
		elseif( ( $outp_bank_date = Tools::check_date($outp_bank_date) ) === false )
			$errdata .= ($errdata?'<br>':'')."- Дата оплаты указана неправильно.";

// outp_amount			
		if( $outp_amount == '' ) $errdata .= ($errdata?'<br>':'')."- Не указана сумма оплаты.";
		else {
			$outp_amount = str_replace(',', '.', $outp_amount);
			if( !is_numeric( $outp_amount ) )
				$errdata .= ($errdata?'<br>':'')."- Неправильно указана сумма оплаты.";
		}
			
// outp_cont_id  cont_name			
		if( $cont_name == '' ) $errdata .= ($errdata?'<br>':'').'- Не указано имя контрагента.';
		elseif( !ctype_digit( $outp_cont_id ) ) 
			$errdata .= ($errdata?'<br>':'').'- Не указан идентификатор контрагента.';
		else {
// Считываем данные контрагента из справочника
			$recset = $db->query('SELECT cont_person, cont_nds FROM contra WHERE cont_id = '.$db->quote($outp_cont_id));                  
			$row = $recset->fetch(PDO::FETCH_ASSOC);
			if( $row ) {
				$cont_person = $row['cont_person'];
				$cont_nds = $row['cont_nds'];
			}
			else { 
				$errdata .= ($errdata?'<br>':'').'- Неправильно указан идентификатор контрагента.';
			}
			$recset->closeCursor();
		}
		
// outp_build_id  build_name
		if( $build_name == '' ) $errdata .= ($errdata?'<br>':'').'- Не указан шифр объекта.';
		elseif( !ctype_digit( $outp_build_id ) ) 
			$errdata .= ($errdata?'<br>':'').'- Не указан идентификатор объекта.';
		else {
// Проверяем наличие обьекта в справочнике
			$recset = $db->query('SELECT build_id FROM builds WHERE build_id = '.$db->quote($outp_build_id));                  
			$row = $recset->fetch(PDO::FETCH_ASSOC);
			if( !$row ) {
				$errdata .= ($errdata?'<br>':'').'- Неправильно указан идентификатор объекта.';
			}
			$recset->closeCursor();
		}
		
// outp_job_id
		if( !$outp_job_id || !ctype_digit($outp_job_id) )
			$errdata .= ($errdata?'<br>':'').'- Не указан идентификатор работы.';
			
// outp_otp_id
		if( !$outp_otp_id || !ctype_digit($outp_otp_id) )
			$errdata .= ($errdata?'<br>':'').'- Не указан идентификатор вида платежа.';
			
//				
// Если есть ошибки - можно уже закончить
//
		if( $errdata ) throw new Exception($errdata, 1);
		
// outp_content
		if( $outp_content == '' ) $errdata .= ($errdata?'<br>':'').'- Не указано назначение платежа.';
		
// outp_account
		if( $outp_account == '' ) $errdata .= ($errdata?'<br>':'').'- Не указан номер счета.';
		
// outp_person
		$outp_person = $outp_person ? $outp_person : $cont_person;
		if( $outp_person == '' ) $errdata .= ($errdata?'<br>':'').'- Не указан инициатор платежа.';
		
// outp_invoice_tax
		if( $outp_invoice_tax == '' && $cont_nds == 0 ) $outp_invoice_tax = 'без НДС';
		
		if( $errdata ) throw new Exception($errdata, 1);
		
// Может быть платеж уже существует
		$outp_key1 = preg_replace( '/[^0-9]/u', '', $outp_bank_date );
		$outp_key2 = preg_replace( '/[^а-яіїa-z0-9]/u', '', mb_strtolower( $outp_account, 'UTF-8') );
		$outp_key  = substr( $outp_key1.' '.$outp_build_id.' '.$outp_key2, 0, 64);
		
		$sqlreq =	'SELECT outp_account, build_name, outp_bank_date FROM outpays '.
					'INNER JOIN builds ON builds.build_id = outpays.outp_build_id '.
					'WHERE outp_key = '.$db->quote($outp_key);
		$recset = $db->query( $sqlreq );
		
		$row = $recset->fetch(PDO::FETCH_ASSOC);
		if( $row ) {
			throw new Exception('Счет с номером "'.$row['outp_account'].'" по объекту "'.$row['build_name'].
				'" за "'.$row['outp_bank_date'].'" уже существует.', 1);
        }    
		$recset->closeCursor();

// Пишем данные
        $sqlreq =   'INSERT INTO outpays ( outp_job_id, outp_otp_id, outp_bank_date, '.
						'outp_amount, outp_cont_id, outp_build_id, '.
						'outp_content, outp_account, outp_person, outp_invoice_act, '.
						'outp_invoice_tax, outp_comment, outp_key, outp_user_id ) '.
                    'VALUES ('. $db->quote($outp_job_id).", ".$db->quote($outp_otp_id).", ".
								$db->quote($outp_bank_date).", ".$db->quote($outp_amount).", ".		
                                $db->quote($outp_cont_id).", ".$db->quote($outp_build_id).", ".	
                                $db->quote($outp_content).", ".$db->quote($outp_account).", ".
                                $db->quote($outp_person).", ".$db->quote($outp_invoice_act).", ".
                                $db->quote($outp_invoice_tax).", ".$db->quote($outp_comment).", ".
                                $db->quote($outp_key).", ".$db->quote($outp_user_id). ")";
												
		$db->exec($sqlreq);
    }
	catch (PDOException $e) {
		$errcode = 1;
		$errmess = ERR_M::DATABASE_ERROR;
	}
    catch ( Exception $e ) {
		$errcode = $e->getCode();
		$errmess = $e->getMessage();
	}

	return array('errcode'=>$errcode,'errmess'=>$errmess);
  }

  public function update() {
	
    $outp_id			= isset($_POST['id']) ? trim(strip_tags($_POST['id'])) : '';
    $outp_bank_date	= isset($_POST['outp_bank_date']) ? trim(strip_tags($_POST['outp_bank_date'])) : '';
    $outp_amount		= isset($_POST['outp_amount']) ? trim(strip_tags($_POST['outp_amount'])) : '';
    $outp_cont_id	= isset($_POST['outp_cont_id']) ? trim(strip_tags($_POST['outp_cont_id'])) : '';
    $cont_name 		= isset($_POST['cont_name']) ? trim(strip_tags($_POST['cont_name'])) : '';
    $outp_build_id	= isset($_POST['outp_build_id']) ? trim(strip_tags($_POST['outp_build_id'])) : '';
    $build_name		= isset($_POST['build_name']) ? trim(strip_tags($_POST['build_name'])) : '';
    $outp_content 	= isset($_POST['outp_content']) ? trim(strip_tags($_POST['outp_content'])) : '';
    $outp_job_id 	= isset($_POST['outp_job_id']) ? trim(strip_tags($_POST['outp_job_id'])) : '';
    $outp_otp_id 	= isset($_POST['outp_otp_id']) ? trim(strip_tags($_POST['outp_otp_id'])) : '';
    $outp_account 	= isset($_POST['outp_account']) ? trim(strip_tags($_POST['outp_account'])) : '';
    $outp_person		= isset($_POST['outp_person']) ? trim(strip_tags($_POST['outp_person'])) : '';
    $outp_invoice_act = isset($_POST['outp_invoice_act']) ? trim(strip_tags($_POST['outp_invoice_act'])) : '';
    $outp_invoice_tax = isset($_POST['outp_invoice_tax']) ? trim(strip_tags($_POST['outp_invoice_tax'])) : '';
    $outp_comment	= isset($_POST['outp_comment']) ? trim(strip_tags($_POST['outp_comment'])) : '';
	
	$cont_person = '';
	$cont_nds = 1;

	$errcode = 0;
	$errmess = '';
    try
    {
// Открываем базу данных
		$db = App::me()->dbOpen();	

// Только зарегистрированные пользователи могут вносить данные
		if( !isset($_SESSION['user_id']) || $_SESSION['user_id'] == 0 )
			throw new Exception(ERR_M::TIMEOUT_ERROR, 999);
		$outp_user_id = $_SESSION['user_id'];

// Есть ли разрешение на изменение чьей либо записи
		$rwd = $_SESSION['priv']->outpays->rwd;
		if( ($rwd & PERM_BITS::WRITE_ANY) == 0 ) throw new Exception(ERR_M::DATA_OPER_DISABLED, 99);
		
// Все ли данные переданы
		$errdata = "";
		
// outp_id
		if( $outp_id == '' ) $errdata = "Не указан идентификатор платежа.";

// outp_bank_date
		if( $outp_bank_date == '' ) $errdata .= ($errdata?'<br>':'')."- Не указана дата оплаты.";
		elseif( ( $outp_bank_date = Tools::check_date($outp_bank_date) ) === false )
			$errdata .= ($errdata?'<br>':'')."- Дата оплаты указана неправильно.";

// outp_amount			
		if( $outp_amount == '' ) $errdata .= ($errdata?'<br>':'')."- Не указана сумма оплаты.";
		else {
			$outp_amount = str_replace(',', '.', $outp_amount);
			if( !is_numeric( $outp_amount ) )
				$errdata .= ($errdata?'<br>':'')."- Неправильно указана сумма оплаты.";
		}
			
// outp_cont_id  cont_name			
		if( $cont_name == '' ) $errdata .= ($errdata?'<br>':'').'- Не указано имя контрагента.';
		elseif( !ctype_digit( $outp_cont_id ) ) 
			$errdata .= ($errdata?'<br>':'').'- Не указан идентификатор контрагента.';
		else {
// Считываем данные контрагента из справочника
			$recset = $db->query('SELECT cont_person, cont_nds FROM contra WHERE cont_id = '.$db->quote($outp_cont_id));                  
			$row = $recset->fetch(PDO::FETCH_ASSOC);
			if( $row ) {
				$cont_person = $row['cont_person'];
				$cont_nds = $row['cont_nds'];
			}
			else { 
				$errdata .= ($errdata?'<br>':'').'- Неправильно указан идентификатор контрагента.';
			}
			$recset->closeCursor();
		}
		
// outp_build_id  build_name
		if( $build_name == '' ) $errdata .= ($errdata?'<br>':'').'- Не указан шифр объекта.';
		elseif( !ctype_digit( $outp_build_id ) ) 
			$errdata .= ($errdata?'<br>':'').'- Не указан идентификатор объекта.';
		else {
// Проверяем наличие обьекта в справочнике
			$recset = $db->query('SELECT build_id FROM builds WHERE build_id = '.$db->quote($outp_build_id));                  
			$row = $recset->fetch(PDO::FETCH_ASSOC);
			if( !$row ) {
				$errdata .= ($errdata?'<br>':'').'- Неправильно указан идентификатор объекта.';
			}
			$recset->closeCursor();
		}
		
// outp_job_id
		if( !$outp_job_id || !ctype_digit($outp_job_id) )
			$errdata .= ($errdata?'<br>':'').'- Не указан идентификатор работы.';
			
// outp_otp_id
		if( !$outp_otp_id || !ctype_digit($outp_otp_id) )
			$errdata .= ($errdata?'<br>':'').'- Не указан идентификатор вида платежа.';
			
// Если есть ошибки - можно закончить
		if( $errdata ) throw new Exception($errdata, 1);
		
// outp_content
		if( $outp_content == '' ) $errdata .= ($errdata?'<br>':'').'- Не указано назначение платежа.';
		
// outp_account
		if( $outp_account == '' ) $errdata .= ($errdata?'<br>':'').'- Не указан номер счета.';
		
// outp_person
		$outp_person = $outp_person ? $outp_person : $cont_person;
		if( $outp_person == '' ) $errdata .= ($errdata?'<br>':'').'- Не указан инициатор платежа.';
		
// outp_invoice_tax
		if( $outp_invoice_tax == '' && $cont_nds == 0 ) $outp_invoice_tax = 'без НДС';
		
		if( $errdata ) throw new Exception($errdata, 1);

// Есть ли разрешение на апдейт этой записи
		if( $rwd & PERM_BITS::WRITE_OTH ) $where = '1 = 1';
		elseif( $rwd & PERM_BITS::WRITE_GRP ) 
			$where = 'outp_user_id IN (SELECT user_id FROM users WHERE cat_id = '.$_SESSION['cat_id'].')';
		elseif( $rwd & PERM_BITS::WRITE_OWN ) $where = 'outp_user_id = '.$_SESSION['user_id'];
		else $where = '1 = 0';
		$where .= ' AND outp_id = '.$db->quote($outp_id);
		
		$sqlreq = 'SELECT COUNT(*) AS count FROM outpays WHERE '.$where.' LIMIT 1';
		$recset = $db->query( $sqlreq );		
		$row = $recset->fetch(PDO::FETCH_ASSOC);
		if( !$row['count'] ) {
			throw new Exception(ERR_M::DATA_OWNER_DISABLED, 99);
        }    
		$recset->closeCursor();
		
// Может быть объект с указаным именем уже существует
		$outp_key1 = preg_replace( '/[^0-9]/u', '', $outp_bank_date );
		$outp_key2 = preg_replace( '/[^а-яіїa-z0-9]/u', '', mb_strtolower( $outp_account, 'UTF-8') );
		$outp_key  = substr( $outp_key1.' '.$outp_build_id.' '.$outp_key2, 0, 64);
		
		$sqlreq =	'SELECT outp_account, build_name, outp_bank_date FROM outpays '.
					'INNER JOIN builds ON builds.build_id = outpays.outp_build_id '.
					'WHERE outp_key = '.$db->quote($outp_key).' AND '.
							'outp_id != '.$db->quote($outp_id);
							
		$recset = $db->query( $sqlreq );
		
		$row = $recset->fetch(PDO::FETCH_ASSOC);
		if( $row ) {
			throw new Exception('Счет с номером "'.$row['outp_account'].'" по объекту "'.$row['build_name'].
				'" за "'.$row['outp_bank_date'].'" уже существует.', 1);
        }    
		$recset->closeCursor();

// Пишем данные
        $sqlreq =   'UPDATE outpays SET '.
						'outp_job_id = '.	$db->quote($outp_job_id).", ".
						'outp_otp_id = '.	$db->quote($outp_otp_id).", ".
						'outp_bank_date = '.$db->quote($outp_bank_date).', '.
						'outp_amount = '.	$db->quote($outp_amount).", ".
						'outp_cont_id = '.	$db->quote($outp_cont_id).", ".
						'outp_build_id = '.	$db->quote($outp_build_id).", ".
						'outp_content = '.	$db->quote($outp_content).", ".
						'outp_account = '.	$db->quote($outp_account).", ".
						'outp_person = '.	$db->quote($outp_person).", ".
						'outp_invoice_act = '.$db->quote($outp_invoice_act).", ".
						'outp_invoice_tax = '.$db->quote($outp_invoice_tax).", ".
						'outp_comment = '.	$db->quote($outp_comment).", ".
						'outp_key = '.		$db->quote($outp_key)." ".
                    'WHERE outp_id = '.$db->quote($outp_id);
												
		$db->exec($sqlreq);
    }
	catch (PDOException $e) {
		$errcode = 1;
		$errmess = ERR_M::DATABASE_ERROR;
	}
    catch ( Exception $e ) {
		$errcode = $e->getCode();
		$errmess = $e->getMessage();
	}

	return array('errcode'=>$errcode,'errmess'=>$errmess);
  }
  
  
  public function delete() {
    $errmess = "";
	$errcode = 0;
		
    $outp_ids = (isset($_REQUEST['id']) && $_REQUEST['id'] != '') ?
        explode(",", $_REQUEST["id"], 100) : array();

    try
    {
// Только зарегистрированные пользователи могут удалять данные
		if( !isset($_SESSION['user_id']) || $_SESSION['user_id'] == 0 )
			throw new Exception(ERR_M::TIMEOUT_ERROR, 999);

// Есть ли разрешение на удаление хоть какой либо записи
		$rwd = $_SESSION['priv']->outpays->rwd;
		if( ($rwd & PERM_BITS::DELETE_ANY) == 0 ) throw new Exception(ERR_M::DATA_OPER_DISABLED, 99);
		
        if (!Tools::is_numeric_array( $outp_ids ))
			throw new Exception(ERR_M::PROTOCOL_ERROR, 1);
        
		$outp_id_list = implode(',', $outp_ids);

// Открываем базу данных
		$db = App::me()->dbOpen();	

// Есть ли разрешение на удаление этих записей
		if( $rwd & PERM_BITS::DELETE_OTH ) $where = '1 = 1';
		elseif( $rwd & PERM_BITS::DELETE_GRP ) 
			$where = 'outp_user_id IN (SELECT user_id FROM users WHERE cat_id = '.$_SESSION['cat_id'].')';
		elseif( $rwd & PERM_BITS::DELETE_OWN ) $where = 'outp_user_id = '.$_SESSION['user_id'];
		else $where = '1 = 0';
		$where .= ' AND outp_id IN ('.$outp_id_list.')';
		
		$sqlreq = 'SELECT COUNT(*) AS count FROM outpays WHERE '.$where;
		$recset = $db->query( $sqlreq );		
		$row = $recset->fetch(PDO::FETCH_ASSOC);
		if( $row['count'] != count($outp_ids) ) {
			throw new Exception(ERR_M::DATA_OWNER_DISABLED, 99);
        }    
		$recset->closeCursor();
		
// Удаляем записи из таблицы
        $sqlreq = "DELETE FROM outpays WHERE outp_id IN (".$outp_id_list.")";
        $db->exec($sqlreq);
	}
	catch (PDOException $e) {
		$errcode = 1;
		$errmess = ERR_M::DATABASE_ERROR;
	}
    catch ( Exception $e ) {
		$errcode = $e->getCode();
		$errmess = $e->getMessage();
	}

	return array('errcode'=>$errcode,'errmess'=>$errmess);
  }
  
}
?>